//@version=6
indicator("GEX / Gamma - SPX", overlay = true, max_boxes_count = 20, max_labels_count = 20, scale = scale.right)

// ─── Inputs ────────────────────────────────────────────────
plusGex   = input.float(6850.0, "+GEX Level",      step = 0.1)
transGex  = input.float(6800.0, "TRANS GEX Level", step = 0.1)
minusGex  = input.float(6750.0, "-GEX Level",      step = 0.1)

bufferPts = input.float(3.0, "Buffer (points above/below)", step = 0.1)

colPlus   = input.color(color.new(color.red,    80), "+GEX Box Color")
colTrans  = input.color(color.new(color.yellow, 80), "TRANS GEX Box Color")
colMinus  = input.color(color.new(color.lime,   80), "-GEX Box Color")

showPlus  = input.bool(true,  "Show +GEX Box")
showTrans = input.bool(true,  "Show TRANS GEX Box")
showMinus = input.bool(true,  "Show -GEX Box")

// Label styling
labelColor  = input.color(color.white, "GEX Label Text Color")
labelOffset = input.int(2, "Label offset (bars to the right)", minval = 1, maxval = 50)

// ─── Day detection (intraday charts) ───────────────────────
dayTime  = time("D")
isNewDay = ta.change(dayTime) != 0

// Track start-of-day bar_index for today and yesterday (for boxes)
var int todayStartIndex = na
var int prevStartIndex  = na

if na(todayStartIndex)
    todayStartIndex := bar_index

if isNewDay
    prevStartIndex  := todayStartIndex
    todayStartIndex := bar_index

// ─── Box handles ───────────────────────────────────────────
var box boxPlus  = na
var box boxTrans = na
var box boxMinus = na

// ─── Label handles ─────────────────────────────────────────
var label lblPlus  = na
var label lblTrans = na
var label lblMinus = na

// ─── Draw / update boxes once we know yesterday's start ────
if not na(prevStartIndex)
    x1 = prevStartIndex
    x2 = bar_index

    // +GEX box
    plusTop    = plusGex + bufferPts
    plusBottom = plusGex - bufferPts
    if showPlus
        if na(boxPlus)
            boxPlus := box.new(x1, plusTop, x2, plusBottom, xloc = xloc.bar_index, bgcolor = colPlus, border_color = colPlus)
        else
            box.set_lefttop(boxPlus, x1, plusTop)
            box.set_rightbottom(boxPlus, x2, plusBottom)
            box.set_bgcolor(boxPlus, colPlus)
            box.set_border_color(boxPlus, colPlus)
    else
        if not na(boxPlus)
            box.set_bgcolor(boxPlus, color.new(colPlus, 100))
            box.set_border_color(boxPlus, color.new(colPlus, 100))

    // TRANS GEX box
    transTop    = transGex + bufferPts
    transBottom = transGex - bufferPts
    if showTrans
        if na(boxTrans)
            boxTrans := box.new(x1, transTop, x2, transBottom, xloc = xloc.bar_index, bgcolor = colTrans, border_color = colTrans)
        else
            box.set_lefttop(boxTrans, x1, transTop)
            box.set_rightbottom(boxTrans, x2, transBottom)
            box.set_bgcolor(boxTrans, colTrans)
            box.set_border_color(boxTrans, colTrans)
    else
        if not na(boxTrans)
            box.set_bgcolor(boxTrans, color.new(colTrans, 100))
            box.set_border_color(boxTrans, color.new(colTrans, 100))

    // -GEX box
    minusTop    = minusGex + bufferPts
    minusBottom = minusGex - bufferPts
    if showMinus
        if na(boxMinus)
            boxMinus := box.new(x1, minusTop, x2, minusBottom, xloc = xloc.bar_index, bgcolor = colMinus, border_color = colMinus)
        else
            box.set_lefttop(boxMinus, x1, minusTop)
            box.set_rightbottom(boxMinus, x2, minusBottom)
            box.set_bgcolor(boxMinus, colMinus)
            box.set_border_color(boxMinus, colMinus)
    else
        if not na(boxMinus)
            box.set_bgcolor(boxMinus, color.new(colMinus, 100))
            box.set_border_color(boxMinus, color.new(colMinus, 100))

    // ─── Labels at exact GEX levels (offset to the right) ───
    labelX = bar_index + labelOffset

    // Build label strings
    plusText  = "+GEX: "   + str.tostring(plusGex)
    transText = "TRANS: "  + str.tostring(transGex)
    minusText = "-GEX: "   + str.tostring(minusGex)

    // +GEX label
    if showPlus
        if na(lblPlus)
            lblPlus := label.new(labelX, plusGex, plusText, xloc = xloc.bar_index,
                                 style = label.style_label_right,
                                 color = color.new(color.black, 100),
                                 textcolor = labelColor,
                                 size = size.normal)
        else
            label.set_x(lblPlus, labelX)
            label.set_y(lblPlus, plusGex)
            label.set_text(lblPlus, plusText)
            label.set_color(lblPlus, color.new(color.black, 100))
            label.set_textcolor(lblPlus, labelColor)
    else
        if not na(lblPlus)
            label.delete(lblPlus)
            lblPlus := na

    // TRANS label
    if showTrans
        if na(lblTrans)
            lblTrans := label.new(labelX, transGex, transText, xloc = xloc.bar_index,
                                   style = label.style_label_right,
                                   color = color.new(color.black, 100),
                                   textcolor = labelColor,
                                   size = size.normal)
        else
            label.set_x(lblTrans, labelX)
            label.set_y(lblTrans, transGex)
            label.set_text(lblTrans, transText)
            label.set_color(lblTrans, color.new(color.black, 100))
            label.set_textcolor(lblTrans, labelColor)
    else
        if not na(lblTrans)
            label.delete(lblTrans)
            lblTrans := na

    // -GEX label
    if showMinus
        if na(lblMinus)
            lblMinus := label.new(labelX, minusGex, minusText, xloc = xloc.bar_index,
                                   style = label.style_label_right,
                                   color = color.new(color.black, 100),
                                   textcolor = labelColor,
                                   size = size.normal)
        else
            label.set_x(lblMinus, labelX)
            label.set_y(lblMinus, minusGex)
            label.set_text(lblMinus, minusText)
            label.set_color(lblMinus, color.new(color.black, 100))
            label.set_textcolor(lblMinus, labelColor)
    else
        if not na(lblMinus)
            label.delete(lblMinus)
            lblMinus := na

// ─── Candle coloring: *real* current calendar day only ────
isToday =
     year(time) == year(timenow) and
     month(time) == month(timenow) and
     dayofmonth(time) == dayofmonth(timenow)

bullCond = isToday and close > transGex
bearCond = isToday and close < transGex

barcolor(bullCond ? color.new(color.lime, 0) : bearCond ? color.new(color.red, 0) : na)
